/* 辅助函数：解析单个北斗字符串 */
function parseSingleStr(str) {
	let sArray
	if (str) {
		sArray = str.split('*')[0].replaceAll('B', '.').replaceAll('F', '-').split('A')
	} else {
		return {
			hour: '0',
			minute: '0',
			second: '0',
			weidu: '0',
			jingdu: '0',
			speed: '0',
			hangxiang: '0',
			fMode: '0',
			altitude: '0',
			wxCount: '0',
			fuyang: '0',
			gundong: '0',
			hangxiangJiao: '0',
			id: '0',
		}
	}
	// 1.时
	let hour = sArray[0]
	// 2.分
	let minute = sArray[1]
	// 3.秒
	let second = sArray[2]
	// 4.纬度
	let weidu = sArray[3]
	// 5.经度
	let jingdu = sArray[4]
	// 6.对地速度
	let speed = sArray[5]
	// 7.航向
	let hangxiang = sArray[6]
	// 8.定位模式 1-单点 2-差分 3-估算 0-无效
	let fMode = sArray[7]
	// 9.海拔
	let altitude = sArray[8]
	// 10.卫星个数
	let wxCount = sArray[9]
	// 11.俯仰角
	let fuyang = sArray[10]
	// 12.滚动角
	let gundong = sArray[11]
	// 13.航向角
	let hangxiangJiao = sArray[12]
	// 14.航空器id"1"/"2"/"3"
	let id = sArray[13]
	return {
		hour,
		minute,
		second,
		weidu,
		jingdu,
		speed,
		hangxiang,
		fMode,
		altitude,
		wxCount,
		fuyang,
		gundong,
		hangxiangJiao,
		id,
	}
}

/* 辅助组装udp对象格式函数 */
function bdparser(bdstr) {
	console.log(`收到的原始北斗短报文数据为：${bdstr}`)
	let obj1 = parseSingleStr(bdstr.split('C')[0])
	let obj2 = parseSingleStr(bdstr.split('C')[1])
	let resArray = [obj1, obj2]
	// 下面为日志输出
	console.log(`收到解析后报文为:${JSON.stringify(resArray)}`)
	return resArray
}

/* 给大屏数据 */
function sendDapinData(server, config, data) {
	let aircraftNumber = Buffer.from([1, 0])
	let constant = Buffer.from([1, 0])
	let jingdu = Buffer.alloc(4) // 1.经度
	let weidu = Buffer.alloc(4) // 2.纬度
	let altitude = Buffer.alloc(4) // 3.高度
	let fuyang = Buffer.alloc(2) // 4.俯仰角-正负90度
	let gundong = Buffer.alloc(2) // 5.滚动角-正负180度
	let pianhang = Buffer.alloc(2) // 6.偏航角-0~360度
	let hou = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
	if (data[0]) {
		jingdu.writeInt32LE(Math.floor(parseFloat(data[0].jingdu) * 1e7))
		weidu.writeInt32LE(Math.floor(parseFloat(data[0].weidu) * 1e7))
		altitude.writeInt32LE(Math.floor(parseFloat(data[0].altitude) * 1e2))
		fuyang.writeInt16LE(Math.floor(parseFloat(data[0].fuyang) * 1e2))
		gundong.writeInt16LE(Math.floor(parseFloat(data[0].gundong) * 1e2))
		pianhang.writeUInt16LE(Math.floor(parseFloat(data[0].hangxiang) * 1e2))
		// 最后组装
		let finalBinData = Buffer.concat([
			aircraftNumber,
			constant,
			jingdu,
			weidu,
			altitude,
			fuyang,
			gundong,
			pianhang,
			hou,
		])
		server.send(finalBinData, config.udpDapinPort, '255.255.255.255')
	}
	if (data[1]) {
		setTimeout(() => {
			jingdu.writeInt32LE(Math.floor(parseFloat(data[1].jingdu) * 1e7))
			weidu.writeInt32LE(Math.floor(parseFloat(data[1].weidu) * 1e7))
			altitude.writeInt32LE(Math.floor(parseFloat(data[1].altitude) * 1e2))
			fuyang.writeInt16LE(Math.floor(parseFloat(data[1].fuyang) * 1e2))
			gundong.writeInt16LE(Math.floor(parseFloat(data[1].gundong) * 1e2))
			pianhang.writeUInt16LE(Math.floor(parseFloat(data[1].hangxiang) * 1e2))
			// 最后组装
			let finalBinData = Buffer.concat([
				aircraftNumber,
				constant,
				jingdu,
				weidu,
				altitude,
				fuyang,
				gundong,
				pianhang,
				hou,
			])
			server.send(finalBinData, config.udpDapinPort, '255.255.255.255')
		}, 30 * 1000)
	}
}

/* 解析BDTCI入口 */
function parserBDTCI(strArray, server, config) {
	// $BDTCI,1002010,1002010,1,000000,2,0,AAAAAAAAAAAAAAAA*47
	const res = bdparser(strArray[7])
	// 测试udp传出去数据
	console.log(`bd->udp传出数据给前端了...`)
	// 通过udp服务器传出去
	server.send(JSON.stringify(res), config.udpServerSendPort, config.udpServerGB)
	// 2.传给大屏的数据
	sendDapinData(server, config, res)
}

// ~~~~~~~~~~导出~~~~~~~~~~
module.exports = parserBDTCI
